import axios from 'axios'
import qs from 'qs'
import store from 'store/index'
import { Toast } from 'vant'
// import { Indicator } from 'mint-ui'
axios.defaults.timeout = 12000 // 请求超时时间
axios.defaults.baseURL = process.env.VUE_APP_BASE_API

axios.defaults.headers.post['Content-Type'] =
    'application/x-www-form-urlencoded;charset=UTF-8' // post请求头的设置
// axios 请求拦截器
axios.interceptors.request.use(
  config => {
    // 可在此设置要发送的token
    const token = store.getters['login/token']
    token && (config.headers.token = token)
    // Indicator.open('数据加载中')
    return config
  },
  error => {
    return Promise.error(error)
  }
)
// axios respone拦截器
axios.interceptors.response.use(
  response => {
    // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
    // 否则的话抛出错误 结合自身业务和后台返回的接口状态约定写respone拦截器
    // Indicator.close()
    // Toast.clear()
    // && response.data.code === 0
    if (response.status === 200) {
      return Promise.resolve(response)
    } else {
      // Toast.allowMultiple()
      Toast({
        message: response.msg || '请求失败',
        position: 'middle',
        duration: 2000
      })
      return Promise.reject(response)
    }
  },
  error => {
    // Indicator.close()
    // Toast.clear()
    // 处理超时的请求
    if (error && error.message && error.message.includes('timeout')) { // 判断请求异常信息中是否含有超时timeout字符串
      // Toast.allowMultiple()
      Toast({
        message: '请求超时',
        position: 'middle',
        duration: 2000
      })
      if (error.response) {
        return Promise.reject(error.response)
      } else {
        return Promise.reject(error) // reject这个错误信息
      }
    }
    // const responseCode = error.response.status
    // const { response: { status } } = error
    if (!(error && error.response && error.response.status)) {
      // Toast.allowMultiple()
      Toast({
        message: '请求失败',
        position: 'middle',
        duration: 2000
      })
      return Promise.reject(error || new Error('请求失败'))
    }
    switch (error.response.status) {
      // 401：未登录
      case 401:
        break
        // 404请求不存在
      case 404:
        // Toast.allowMultiple()
        Toast({
          message: '网络请求不存在',
          position: 'middle',
          duration: 2000
        })
        break
      default:
        let message = '请求失败'
        const { response: { msg } } = error
        if (msg) {
          message = msg
        }
        // Toast.allowMultiple()
        Toast({
          message: message + '!',
          position: 'middle',
          duration: 2500
        })
    }
    return Promise.reject(error.response)
  }
)
/**
 * 封装get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function get (url, params = {}, config = {}) {
  return new Promise((resolve, reject) => {
    let toastIns = null
    if (config.indicator) {
      // Indicator.open('数据加载中')
      toastIns = Toast.loading({
        message: '加载中...',
        forbidClick: true,
        loadingType: 'spinner'
      })
    }
    axios
      .get(url, {
        params: params
      })
      .then(res => {
        resolve(res.data)
        // Indicator.close()
        toastIns && toastIns.clear()
      })
      .catch(err => {
        // Indicator.close()
        toastIns && toastIns.clear()
        reject(err)
      })
  })
  // 或者return axios.get();
}
/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function post (url, params, config = {}) {
  return new Promise((resolve, reject) => {
    let toastIns = null
    if (config.indicator) {
      // Indicator.open('数据加载中')
      toastIns = Toast.loading({
        message: '加载中...',
        forbidClick: true,
        loadingType: 'spinner'
      })
    }
    axios
      .post(url, qs.stringify(params))
      .then(res => {
        resolve(res.data)
        // Indicator.close()
        toastIns && toastIns.clear()
      })
      .catch(err => {
        // Indicator.close()
        toastIns && toastIns.clear()
        reject(err)
      })
  })
  //  或者return axios.post();
}

export { get, post }
